<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>areaDetector Plugin NDPluginStats</title>
  <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
</head>
<body>
  <div style="text-align: center">
    <h1>
      areaDetector Plugin NDPluginStats</h1>
    <h2>
      June 25, 2018</h2>
    <h2>
      Mark Rivers</h2>
    <h2>
      University of Chicago</h2>
  </div>
  <h2>
    Contents</h2>
  <ul>
    <li><a href="#Overview">Overview</a></li>
    <li><a href="#Configuration">Configuration</a></li>
    <li><a href="#Screens">Screen shots</a></li>
  </ul>
  <h2 id="Overview">
    Overview
  </h2>
  <p>
    NDPluginStats computes the following.
  </p>
  <ol>
    <li>Basic statistics: minimum, maximum, mean, sigma, total, and net (background subtracted).</li>
    <li>Centroid, sigma, skewness and kurtosis values in the X and Y dimensions.</li>
    <li>Profiles of the array in the X and Y dimensions. A total of 8 profiles are calculated:
      <ul>
        <li>The average profiles in the X and Y directions. </li>
        <li>The average profiles in the X and Y directions, for array elements greater than
          the centroid threshold.</li>
        <li>The profiles in the X and Y directions at the X and Y centroid position.</li>
        <li>The profiles in the X and Y directions at a user-defined X and Y cursor position.</li>
      </ul>
    </li>
    <li>A histogram of the values (e.g. number of pixels versus intensity per pixel).</li>
  </ol>
  <p>
    Each calculcation can be independently enabled and disabled. Calculations 1 and
    4 can be perfomed on arrays of any dimension. Calculations 2 and 3 are restricted
    to 2-D arrays.
  </p>
  <p>
    Time-series arrays of the basic statistics, centroid and sigma statistics can also
    be collected. This is very useful for on-the-fly data acquisition, where the NDStats
    plugin computes the net or total counts in the detector or an ROI. It can also be
    used to quickly plot a time-history of beam position or width, etc. The time series
    can also be used in a circular buffer mode where is continuously displays the last
    N values of the statistic.</p>
  <p>
    NDPluginStats inherits from NDPluginDriver. The <a href="areaDetectorDoxygenHTML/class_n_d_plugin_stats.html">
      NDPluginStats class documentation</a> describes this class in detail.
  </p>
  <p>
    NDPluginStats.h defines the following parameters. It also implements all of the
    standard plugin parameters from <a href="pluginDoc.html#NDPluginDriver">NDPluginDriver</a>.
    The EPICS database NDStats.template provide access to these parameters, listed in
    the following table. Note that to reduce the width of this table the parameter index
    variable names have been split into 2 lines, but these are just a single name, for
    example <code>NDPluginStatsComputeStatistics</code>.
  </p>
  <table border="1" cellpadding="2" cellspacing="2" style="text-align: left">
    <tbody>
      <tr>
        <td align="center" colspan="7,">
          <b>Parameter Definitions in NDPluginStats.h and EPICS Record Definitions in NDStats.template</b>
        </td>
      </tr>
      <tr>
        <th>
          Parameter index variable
        </th>
        <th>
          asyn interface
        </th>
        <th>
          Access
        </th>
        <th>
          Description
        </th>
        <th>
          drvInfo string
        </th>
        <th>
          EPICS record name
        </th>
        <th>
          EPICS record type
        </th>
      </tr>
      <tr>
        <td align="center" colspan="7,">
          <b>Basic statistics</b>
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ComputeStatistics
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Flag to control whether to compute statistics for this array (0=No, 1=Yes). Not
          computing statistics reduces CPU load. Basic statistics computations are quite fast,
          since they involve mostly double precision addition, with 1 multiply to compute
          sigma, per array element.
        </td>
        <td>
          COMPUTE_STATISTICS
        </td>
        <td>
          $(P)$(R)ComputeStatistics<br />
          $(P)$(R)ComputeStatistics_RBV
        </td>
        <td>
          bo<br />
          bi
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          BgdWidth
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Width of the background in pixels to use when computing net counts. 0=no background
          subtraction, so the net counts is the same as the total counts.
        </td>
        <td>
          BGD_WIDTH
        </td>
        <td>
          $(P)$(R)BgdWidth<br />
          $(P)$(R)BgdWidth_RBV
        </td>
        <td>
          longout<br />
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MinValue
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Minimum value in any element in the array
        </td>
        <td>
          MIN_VALUE
        </td>
        <td>
          $(P)$(R)MinValue_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MinX
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          X pixel location of minimum value in the array. This is only valid for 2-D monochromatic
          arrays.
        </td>
        <td>
          MIN_X
        </td>
        <td>
          $(P)$(R)MinX_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MinY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Y pixel location of minimum value in the array. This is only valid for 2-D monochromatic
          arrays.
        </td>
        <td>
          MIN_Y
        </td>
        <td>
          $(P)$(R)MinY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MaxValue
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Maximum value in any element in the array
        </td>
        <td>
          MAX_VALUE
        </td>
        <td>
          $(P)$(R)MaxValue_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MaxX
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          X pixel location of maximum value in the array. This is only valid for 2-D monochromatic
          arrays.
        </td>
        <td>
          MAX_X
        </td>
        <td>
          $(P)$(R)MaxX_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MaxY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Y pixel location of maximum value in the array. This is only valid for 2-D monochromatic
          arrays.
        </td>
        <td>
          MAX_Y
        </td>
        <td>
          $(P)$(R)MaxY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          MeanValue
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Mean value in the array
        </td>
        <td>
          MEAN_VALUE
        </td>
        <td>
          $(P)$(R)MeanValue_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          Total
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Sum (total) of all elements in the array. This is available as an ai record. The
          total counts are also available as epicsInt32 values in an mca record via callbacks
          to the drvFastSweep driver. The mca record is very useful for on-the-fly data acquisition
          of the total counts in the detector or in an ROI.
        </td>
        <td>
          TOTAL
        </td>
        <td>
          $(P)$(R)Total_RBV<br />
          $(P)$(R)TotalArray
        </td>
        <td>
          ai<br />
          mca
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          Net
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Net (background subtracted) total of all elements in the array. The background is
          calculated by determining the average counts per array element in a border around
          the array of width NDPluginStatsBgdWidth. This average background counts per element
          is then subtracted from all elements inside the array. If NDPluginStatsBgdWidth
          is &le; 0 then no background is computed. The net counts is available as an ai record.
          The net counts is also available as epicsInt32 values in an mca record via callbacks
          to the drvFastSweep driver. The mca record is very useful for on-the-fly data acquisition
          of the net counts in the detector or in an ROI.
        </td>
        <td>
          NET
        </td>
        <td>
          $(P)$(R)Net_RBV<br />
          $(P)$(R)NetArray
        </td>
        <td>
          ai<br />
          mca
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          SigmaValue
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Sigma (standard deviation) of all elements in the array
        </td>
        <td>
          SIGMA_VALUE
        </td>
        <td>
          $(P)$(R)Sigma_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td align="center" colspan="7,">
          <b>Centroid statistics</b>
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ComputeCentroid
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Flag to control whether to compute the centroid statistics (0=No, 1=Yes). The centroids
          are computed from the average row and column profiles above the centroid threshold.
          These calculations are also quite fast, since they just involve addition operations
          for each array element.
        </td>
        <td>
          COMPUTE_CENTROID
        </td>
        <td>
          $(P)$(R)ComputeCentroid<br />
          $(P)$(R)ComputeCentroid_RBV
        </td>
        <td>
          bo<br />
          bi
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          CentroidThreshold
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/w
        </td>
        <td>
          Threshold used when computing the centroid statistics. All array elements less than
          this value are set to 0 for computing the centroid statistics. It is important to
          set this value to ignore the "background" when computing the position and size of
          a "beam" image, for example.
        </td>
        <td>
          CENTROID_THRESHOLD
        </td>
        <td>
          $(P)$(R)CentroidThreshold<br />
          $(P)$(R)CentroidThreshold_RBV
        </td>
        <td>
          ao<br />
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          CentroidTotal
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Total mass, sum of all elements above the threshold.
        </td>
        <td>
          CENTROID_TOTAL
        </td>
        <td>
          $(P)$(R)CentroidTotal_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          CentroidX
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          X centroid of the array above the centroid threshold.
        </td>
        <td>
          CENTROIDX_VALUE
        </td>
        <td>
          $(P)$(R)CentroidX_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          CentroidY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Y centroid of the array above the centroid threshold.
        </td>
        <td>
          CENTROIDY_VALUE
        </td>
        <td>
          $(P)$(R)CentroidY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          SigmaX
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Sigma X (width) of the distribution above the centroid threshold.
        </td>
        <td>
          SIGMAX_VALUE
        </td>
        <td>
          $(P)$(R)SigmaX_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          SigmaY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Sigma Y (height) of the distribution above the centroid threshold.
        </td>
        <td>
          SIGMAY_VALUE
        </td>
        <td>
          $(P)$(R)SigmaY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          SigmaXY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          This is the normalized value of sigmaXY, i.e. sigmaXY/(sigmaX * sigmaY). This is
          often called the correlation coefficient, r. It is zero if the X and Y profiles
          are not correlated, meaning that the distribution is not tilted with respect to
          the X and Y axes.
        </td>
        <td>
          SIGMAXY_VALUE
        </td>
        <td>
          $(P)$(R)SigmaXY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          SkewX
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Skewness X (symmetry) of the distribution above the centroid threshold, in relation
          to the center of mass.
          <ul>
            <li>== 0, symmetric distribution </li>
            <li>< 0, distribution assymetric to the left </li>
            <li>> 0, distribution assymetric to the right </li>
          </ul>
        </td>
        <td>
          SKEWX_VALUE
        </td>
        <td>
          $(P)$(R)SkewX_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          SkewY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Skewness Y (symmetry) of the distribution above the centroid threshold, in relation
          to the center of mass.
          <ul>
            <li>== 0, symmetric distribution </li>
            <li>< 0, distribution assymetric to the top </li>
            <li>> 0, distribution assymetric to the bottom </li>
          </ul>
        </td>
        <td>
          SKEWY_VALUE
        </td>
        <td>
          $(P)$(R)SkewY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          KurtosisX
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Excess Kurtosis X (flatness) of the distribution above the centroid threshold.
          <ul>
            <li>== 0, Gaussian (normal) distribution </li>
            <li>< 0, distribution flatter than normal </li>
            <li>> 0, distribution more peaky than normal </li>
          </ul>
        </td>
        <td>
          KURTOSISX_VALUE
        </td>
        <td>
          $(P)$(R)KurtosisX_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          KurtosisY
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Excess Kurtosis Y (flatness) of the distribution above the centroid threshold.
          <ul>
            <li>== 0, Gaussian (normal) distribution </li>
            <li>< 0, distribution flatter than normal </li>
            <li>> 0, distribution more peaky than normal </li>
          </ul>
        </td>
        <td>
          KURTOSISY_VALUE
        </td>
        <td>
          $(P)$(R)KurtosisY_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          Eccentricity
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Eccentricity, can take values from 0 to 1. 0 means a perfectly round object and
          1 mean a line shaped object.
        </td>
        <td>
          ECCENTRICITY_VALUE
        </td>
        <td>
          $(P)$(R)Eccentricity_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          Orientation
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Orientation of the object, orientation of the "long" direction with respect to horizontal
          (x axis).
        </td>
        <td>
          ORIENTATION_VALUE
        </td>
        <td>
          $(P)$(R)Orientation_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td align="center" colspan="7,">
          <b>Time-Series data</b><br />
        </td>
      </tr>
      <tr>
        <td colspan="7,">
          The time series is implemented by loading an instance of the <a href="NDPluginTimeSeries.html">
            NDPluginTimeSeries</a> for each NDPluginStats plugin, and the time series control
          uses records in NDTimeSeries.template. That documentation should be consulted for
          an explanation of these records. The prefix and record name macro for the time-series
          plugin records from NDTimeSeries.template is $(P)$(R)TS:.<br />
          <b>NOTE:</b> The time-series plugin is often used with drivers which sample at a
          fixed well-defined time interval. This cannot be guaranteed with the statistics
          plugin, so the averaging time records and time axis waveform record from NDPluginTimeSeries
          are typically not used, and the statistics data are plotted against time point #,
          rather than actual time.
          <br />
          The time-series waveform records for each statistic are defined in NDStats.template.
        </td>
      </tr>
      <tr>
        <td>
          NDPluginTimeSeries<br />
          TSTimeSeries
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          The time series data arrays of the basic statistics and centroid and sigma statistics
          described above.
        </td>
        <td>
          TS_TIME_SERIES
        </td>
        <td>
          $(P)$(R)XXX, where XXX is:<br />
          <ul>
            <li>TSMinValue</li>
            <li>TSMinX</li>
            <li>TSMinY</li>
            <li>TSMaxValue</li>
            <li>TSMaxX</li>
            <li>TSMaxY</li>
            <li>TSMeanValue</li>
            <li>TSSigma</li>
            <li>TSTotal</li>
            <li>TSNet</li>
            <li>TSCentroidX</li>
            <li>TSCentroidY</li>
            <li>TSSigmaX</li>
            <li>TSSigmaY</li>
            <li>TSSigmaXY</li>
            <li>TSSkewX</li>
            <li>TSSkewY</li>
            <li>TSKurtosisX</li>
            <li>TSKurtosisY</li>
            <li>TSEccenticity</li>
            <li>TSOrientation</li>
            <li>TSTimestamp</li>
          </ul>
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td align="center" colspan="7,">
          <b>X and Y Profiles</b>
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ComputeProfiles
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Flag to control whether to compute the profiles for this array (0=No, 1=Yes).
        </td>
        <td>
          COMPUTE_PROFILES
        </td>
        <td>
          $(P)$(R)ComputeProfiles<br />
          $(P)$(R)ComputeProfiles_RBV
        </td>
        <td>
          bo<br />
          bi
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileSizeX
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Number of array elements in the X profiles.
        </td>
        <td>
          PROFILE_SIZE_X
        </td>
        <td>
          $(P)$(R)ProfileSizeX_RBV
        </td>
        <td>
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileSizeY
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Number of array elements in the Y profiles.
        </td>
        <td>
          PROFILE_SIZE_Y
        </td>
        <td>
          $(P)$(R)ProfileSizeY_RBV
        </td>
        <td>
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          CursorX
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          X position of a user-defined cursor for profiles.
        </td>
        <td>
          CURSOR_X
        </td>
        <td>
          $(P)$(R)CursorX<br />
          $(P)$(R)CursorX_RBV
        </td>
        <td>
          longout<br />
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          CursorY
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Y position of a user-defined cursor for profiles.
        </td>
        <td>
          CURSOR_Y
        </td>
        <td>
          $(P)$(R)CursorY<br />
          $(P)$(R)CursorY_RBV
        </td>
        <td>
          longout<br />
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileAverageX
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Profile of the average row in the array, i.e. the sum of all rows in the array divided
          by the number of rows.
        </td>
        <td>
          PROFILE_AVERAGE_X
        </td>
        <td>
          $(P)$(R)ProfileAverageX_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileAverageY
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Profile of the average column in the array, i.e. the sum of all columns in the array
          divided by the number of columns.
        </td>
        <td>
          PROFILE_AVERAGE_Y
        </td>
        <td>
          $(P)$(R)ProfileAverageY_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileThresholdX
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Same as ProfileAverageX except that all array elements less than CentroidThreshold
          are set to zero when computing the average.
        </td>
        <td>
          PROFILE_THRESHOLD_X
        </td>
        <td>
          $(P)$(R)ProfileThresholdX_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileThresholdY
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Same as ProfileAverageY except that all array elements less than CentroidThreshold
          are set to zero when computing the average.
        </td>
        <td>
          PROFILE_THRESHOLD_Y
        </td>
        <td>
          $(P)$(R)ProfileThresholdY_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileCentroidX
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          X profile through the array in the row defined by CentroidY.
        </td>
        <td>
          PROFILE_CENTROID_X
        </td>
        <td>
          $(P)$(R)ProfileCentroidX_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileCentroidY
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Y profile through the array in the column defined by CentroidX.
        </td>
        <td>
          PROFILE_CENTROID_Y
        </td>
        <td>
          $(P)$(R)ProfileCentroidY_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileCursorX
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          X profile through the array in the row defined by CursorY.
        </td>
        <td>
          PROFILE_CURSOR_X
        </td>
        <td>
          $(P)$(R)ProfileCursorX_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ProfileCursorY
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Y profile through the array in the row defined by CursorX.
        </td>
        <td>
          PROFILE_CURSOR_Y
        </td>
        <td>
          $(P)$(R)ProfileCursorY_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td align="center" colspan="7,">
          <b>Array histogram</b>
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          ComputeHistogram
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Flag to control whether to compute the histogram for this array (0=No, 1=Yes). Not
          computing the histogram reduces CPU load.
        </td>
        <td>
          COMPUTE_HISTOGRAM
        </td>
        <td>
          $(P)$(R)ComputeHistogram<br />
          $(P)$(R)ComputeHistogram_RBV
        </td>
        <td>
          bo<br />
          bi
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistSize
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/w
        </td>
        <td>
          Number of elements (bins) in the histogram
        </td>
        <td>
          HIST_SIZE
        </td>
        <td>
          $(P)$(R)HistSize<br />
          $(P)$(R)HistSize_RBV
        </td>
        <td>
          longout<br />
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistMin
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/w
        </td>
        <td>
          Minimum value for the histogram. All values less than this will be counted in HistBelow.
        </td>
        <td>
          HIST_MIN
        </td>
        <td>
          $(P)$(R)HistMin<br />
          $(P)$(R)HistMin_RBV
        </td>
        <td>
          ao<br />
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistMax
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/w
        </td>
        <td>
          Maximum value for the histogram. All values greater than this will be counted in
          HistAbove.
        </td>
        <td>
          HIST_MAX
        </td>
        <td>
          $(P)$(R)HistMax<br />
          $(P)$(R)HistMax_RBV
        </td>
        <td>
          ao<br />
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistBelow
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/o
        </td>
        <td>
          Count of all values less than HistMin.
        </td>
        <td>
          HIST_BELOW
        </td>
        <td>
          $(P)$(R)HistBelow_RBV
        </td>
        <td>
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistAbove
        </td>
        <td>
          asynInt32
        </td>
        <td>
          r/o
        </td>
        <td>
          Count of all values greater than HistMax.
        </td>
        <td>
          HIST_ABOVE
        </td>
        <td>
          $(P)$(R)HistAbove_RBV
        </td>
        <td>
          longin
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistEntropy
        </td>
        <td>
          asynFloat64
        </td>
        <td>
          r/o
        </td>
        <td>
          Entropy of the image. This is a measure of the sharpness of the histogram, and is
          often a useful figure of merit for determining sharpness of focus, etc. It is defined
          as -SUM(BIN[i]*log(BIN[i]), where the sum is over the number of bins in the histogram
          and BIN[i] is the number of elements in bin i.
        </td>
        <td>
          HIST_ENTROPY
        </td>
        <td>
          $(P)$(R)HistEntropy_RBV
        </td>
        <td>
          ai
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistArray
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Histogram array, i.e. counts in each histogram bin.
        </td>
        <td>
          HIST_ARRAY
        </td>
        <td>
          $(P)$(R)Histogram_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
      <tr>
        <td>
          NDPluginStats<br />
          HistXArray
        </td>
        <td>
          asynFloat64Array
        </td>
        <td>
          r/o
        </td>
        <td>
          Histogram X-axis array, i.e. minimum intensity in each histogram bin.
        </td>
        <td>
          HIST_X_ARRAY
        </td>
        <td>
          $(P)$(R)HistogramX_RBV
        </td>
        <td>
          waveform
        </td>
      </tr>
    </tbody>
  </table>
  <p>
    If the values of CentroidThreshold, CursorX, or CursorY are changed then the centroid
    and profile calculations are performed again immediately on the last array collected.
    Thus updated centroid statistics and profiles can be displayed even when new arrays
    are not being acquired. These calculations are only performed when enabled by ComputeCentroid
    and ComputeProfiles.</p>
  <h2 id="Configuration">
    Configuration</h2>
  <p>
    The NDPluginStats plugin is created with the NDStatsConfigure command, either from
    C/C++ or from the EPICS IOC shell.</p>
  <pre>NDStatsConfigure(const char *portName, int queueSize, int blockingCallbacks,
               const char *NDArrayPort, int NDArrayAddr,
               int maxBuffers, size_t maxMemory,
               int priority, int stackSize)
  </pre>
  <p>
    For details on the meaning of the parameters to this function refer to the detailed
    documentation on the NDStatsConfigure function in the <a href="areaDetectorDoxygenHTML/_n_d_plugin_stats_8cpp.html">
      NDPluginStats.cpp documentation</a> and in the documentation for the constructor
    for the <a href="areaDetectorDoxygenHTML/class_n_d_plugin_stats.html">NDPluginStats
      class</a>.
  </p>
  <h2 id="Screens">
    Screen shots</h2>
  <p>
    The following MEDM screen provides access to the parameters in NDPluginDriver.h
    and NDPluginStats.h through records in NDPluginBase.template and NDStats.template.
  </p>
  <div style="text-align: center">
    <h3>
      NDStats.adl</h3>
    <img alt="NDStats.png" src="NDStats.png" />
  </div>
  <p>
    The following MEDM screen shows the average profile of an image in the X direction.
  </p>
  <div style="text-align: center">
    <h3>
      NDPlot.adl</h3>
    <img alt="NDStats_AverageX.png" src="NDStats_AverageX.png" />
  </div>
  <p>
    The following MEDM screen shows the profile of an image in the Y direction at the
    location of the user-defined cursor.
  </p>
  <div style="text-align: center">
    <h3>
      NDPlot.adl</h3>
    <img alt="NDStats_CursorY.png" src="NDStats_CursorY.png" />
  </div>
  <p>
    The following MEDM screen shows the histogram of intensities of an array.
  </p>
  <div style="text-align: center">
    <h3>
      NDPlotXY.adl</h3>
    <img alt="NDStats_Histogram.png" src="NDStats_Histogram.png" />
  </div>
  <p>
    The following MEDM screen combines many parameters for 5 NDPluginStats plugins on
    a single screen.
  </p>
  <div style="text-align: center">
    <h3>
      NDStats5.adl</h3>
    <img alt="NDStats5.png" src="NDStats5.png" />
  </div>
  <p>
    The following MEDM screen shows the the total counts from the Stats1 plugin. This
    is the total counts as a function of time.
  </p>
  <div style="text-align: center">
    <h3>
      NDTimeSeries.adl</h3>
    <img alt="NDStatsTimeSeriesTotal.png" src="NDStatsTimeSeriesTotal.png" />
  </div>
  <p>
    The following MEDM screen shows the Y centroid as a function of time from the Stats1
    plugin.
  </p>
  <div style="text-align: center">
    <h3>
      NDTimeSeries.adl</h3>
    <img alt="NDStatsTimeSeriesCentroidY.png" src="NDStatsTimeSeriesCentroidY.png" />
  </div>
  <p>
    The following MEDM screen shows all of the basic statistics as a function of time
    from the Stats1 plugin.
  </p>
  <div style="text-align: center">
    <h3>
      NDStatsTimeSeriesBasicAll.adl</h3>
    <img alt="NDStatsTimeSeriesBasicAll.png" src="NDStatsTimeSeriesBasicAll.png" />
  </div>
  <p>
    The following MEDM screen shows all of the centroid statistics as a function of
    time from the Stats1 plugin.
  </p>
  <div style="text-align: center">
    <h3>
      NDStatsTimeSeriesCentroidAll.adl</h3>
    <img alt="NDStatsTimeSeriesCentroidAll.png" src="NDStatsTimeSeriesCentroidAll.png" />
  </div>
</body>
</html>
